#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    init();//调用程序初始化函数
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::init()
{
    this->setCentralWidget(ui->stackedWidget);//设置程序中心组件

    ui->toolBar->hide();//隐藏工具栏

    loadDataFile();//加载汽车数据和用户数据
}

void MainWindow::loadDataFile()
{
    //加载汽车数据
    QFile file(g_carFileName);
    if(file.exists()&&file.open(QIODevice::ReadOnly)){//打开汽车数据文件
        QTextStream stream(&file);//以文本流的方式读取文件
        stream.setCodec("UTF-8");//设置编码方式为u8
        for(;!stream.atEnd();){//循环读取文件行,直到读完文件内容
            QStringList datas=stream.readLine().split('\t',Qt::SkipEmptyParts);//将文本行内容分开
            if(datas.count()<4)continue;//如果缺少数据则跳过改行
            car c(datas[0],datas[1],datas[2],datas[3],&m_carMap);//实例化汽车对象
            m_carMap[datas[0]]=c;//将汽车加入管理图
        }
        file.close();//关闭文件
    }

    //加载用户数据
    file.setFileName(g_userFileName);
    if(file.exists()&&file.open(QIODevice::ReadOnly)){
        QTextStream stream(&file);
        stream.setCodec("UTF-8");
        for(;!stream.atEnd();){
            QStringList datas=stream.readLine().split('\t',Qt::SkipEmptyParts);
            if(datas.count()<4)continue;
            user u(datas[0],datas[1],datas[2],(UserRole)datas[3].toInt(),&m_carMap);
            m_userMap[datas[1]]=u;
        }
        file.close();
    }
}

void MainWindow::saveDate()
{
    QStandardItemModel* model=static_cast<QStandardItemModel*>(ui->tvAdmin->model());
    //保存汽车数据
    QFile file(g_carFileName);
    if(file.open(QIODevice::WriteOnly)){//打开汽车数据文件
        QTextStream stream(&file);//以文本流的方式读取文件
        stream.setCodec("UTF-8");//设置编码方式为u8
        for(int i=0;i<model->rowCount();++i){//将m_carMap中保存的数据都加入
            if(i!=0)stream<<"\n";
            stream<<model->data(model->index(i,0)).toString();
            stream<<"\t"<<model->data(model->index(i,1)).toString();
            stream<<"\t"<<model->data(model->index(i,2)).toString();
            stream<<"\t"<<model->data(model->index(i,3)).toString();
        }
        file.close();//关闭文件
    }
}

void MainWindow::adminUiInit()
{
    ui->groupAdminTools->show();//显示管理员工具栏

    //初始化管理员界面视图模型
    QStandardItemModel* model=new QStandardItemModel(this);
    model->setColumnCount(6);//设置表格为五列
    model->setHeaderData(0,Qt::Horizontal,"车牌号");//设置表头
    model->setHeaderData(1,Qt::Horizontal,"类型");
    model->setHeaderData(2,Qt::Horizontal,"颜色");
    model->setHeaderData(3,Qt::Horizontal,"入场时间");
    model->setHeaderData(4,Qt::Horizontal,"停车时间");
    model->setHeaderData(5,Qt::Horizontal,"费用");

    ui->tvAdmin->setEditTriggers(QAbstractItemView::NoEditTriggers);//管理员表格默认不可编辑
    ui->tvAdmin->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//设置视图自动拉伸
    ui->tvAdmin->setModel(model);//绑定视图和模型

    //添加汽车数据
    for(auto i=m_carMap.begin();i!=m_carMap.end();++i){
        model->insertRow(model->rowCount());//添加一行
        model->setData(model->index(model->rowCount()-1,0),i.value().getCarNum());//为模型赋值
        model->setData(model->index(model->rowCount()-1,1),i.value().getCarType());
        model->setData(model->index(model->rowCount()-1,2),i.value().getColor());
        model->setData(model->index(model->rowCount()-1,3),i.value().getAllTime().toString("yyyy-MM-dd-hh:mm:ss"));
        long long t=i.value().getAllTime().secsTo(QDateTime::currentDateTime());
        model->setData(model->index(model->rowCount()-1,4),QString("%1天%2时%3分%4秒").arg(t/24/60/60).arg((t%(24*60*60))/60/60).arg(t%(60*60)/60).arg(t%60));
        model->setData(model->index(model->rowCount()-1,5),((t%(24*60*60)/60/60)+(t%3600?1:0))*g_priceByHour);
    }

    ui->toolBar->show();//显示工具栏
    ui->stackedWidget->setCurrentWidget(ui->pagMain);//切换至主界面
}

void MainWindow::userUiInit()
{
    ui->groupAdminTools->hide();//隐藏管理员工具栏

    //初始化管理员界面视图模型
    QStandardItemModel* model=new QStandardItemModel(this);
    model->setColumnCount(6);//设置表格为五列
    model->setHeaderData(0,Qt::Horizontal,"车牌号");//设置表头
    model->setHeaderData(1,Qt::Horizontal,"类型");
    model->setHeaderData(2,Qt::Horizontal,"颜色");
    model->setHeaderData(3,Qt::Horizontal,"入场时间");
    model->setHeaderData(4,Qt::Horizontal,"停车时间");
    model->setHeaderData(5,Qt::Horizontal,"费用");

    ui->tvAdmin->setEditTriggers(QAbstractItemView::NoEditTriggers);//管理员表格默认不可编辑
    ui->tvAdmin->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//设置视图自动拉伸
    ui->tvAdmin->setModel(model);//绑定视图和模型

    //添加汽车数据
    for(auto i=m_carMap.begin();i!=m_carMap.end();++i){
        model->insertRow(model->rowCount());//添加一行
        model->setData(model->index(model->rowCount()-1,0),i.value().getCarNum());//为模型赋值
        model->setData(model->index(model->rowCount()-1,1),i.value().getCarType());
        model->setData(model->index(model->rowCount()-1,2),i.value().getColor());
        model->setData(model->index(model->rowCount()-1,3),i.value().getAllTime().toString("yyyy-MM-dd-hh:mm:ss"));
        long long t=i.value().getAllTime().secsTo(QDateTime::currentDateTime());
        model->setData(model->index(model->rowCount()-1,4),QString("%1天%2时%3分%4秒").arg(t/24/60/60).arg((t%(24*60*60))/60/60).arg(t%(60*60)/60).arg(t%60));
        model->setData(model->index(model->rowCount()-1,5),((t%(24*60*60)/60/60)+(t%3600?1:0))*g_priceByHour);
    }

    ui->toolBar->show();//显示工具栏
    ui->stackedWidget->setCurrentWidget(ui->pagMain);
}

void MainWindow::on_btnLoginLogin_clicked()
{
    //获取输入的账号和密码
    QString account=ui->editAccountLogin->text();
    QString pswd=ui->editPswdLogin->text();

    //如果输入信息不完全则退出登录
    if(account.isEmpty()||pswd.isEmpty()){
        QMessageBox::warning(this,"警告","请输入完整的信息.");
        return;
    }

    //判断密码是否正确和身份是否正确
    UserRole r=(UserRole)ui->radioAdminLogin->isChecked();
    if(m_userMap[account].compPsed(pswd,r)){
        m_curUser=m_userMap[account];
        if(r==UserRole::Admin){//作为管理员登录
            adminUiInit();
        }else if(r==UserRole::User){//作为用户登录
            userUiInit();
        }
    }else{//密码不正确
        QMessageBox::warning(this,"警告","账号或密码错误.");
        return;
    }
}


void MainWindow::on_btnFindAdmin_clicked()
{
    //获取需要查找的字符串
    QString findStr=ui->editFindAdmin->text();

    //如果字符串为空则显示所有汽车信息
    QAbstractItemModel* model=ui->tvAdmin->model();
    if(findStr.isEmpty()){
        for(int i=0;i<model->rowCount();++i){
            ui->tvAdmin->showRow(i);
        }
    }else{//如果查找字符串不为空则显示指定车牌号汽车信息
        for(int i=0;i<model->rowCount();++i){
            ui->tvAdmin->hideRow(i);
            if(model->data(model->index(i,0)).toString()==findStr){
                ui->tvAdmin->showRow(i);
            }
        }
    }
}


void MainWindow::on_cheEditAdmin_stateChanged(int arg1)
{
    if(arg1){//如果勾选编辑单选框则启用管理员界面视图的编辑
        ui->tvAdmin->setEditTriggers(QAbstractItemView::AllEditTriggers);
    }else{//否则禁用编辑
        ui->tvAdmin->setEditTriggers(QAbstractItemView::NoEditTriggers);
    }
}


void MainWindow::on_btnAppendAdmin_clicked()
{

    QAbstractItemModel* model=ui->tvAdmin->model();//获取管理员界面汽车视图绑定的数据模型
    model->insertRow(model->rowCount());//插入一行数据
    model->setData(model->index(model->rowCount()-1,3),QDateTime::currentDateTime().toString("yyyy-MM-dd-hh:mm:ss"));
}


void MainWindow::on_btnDeleteAdmin_clicked()
{
    QModelIndex index=ui->tvAdmin->currentIndex();//获取管理员界面汽车数据视图当前选择的行
    QAbstractItemModel* model=ui->tvAdmin->model();
    if(index.isValid()){//如果选择可用
        model->removeRow(index.row());//移除选中行
        ui->tvAdmin->setCurrentIndex(QModelIndex());//置空选择行
    }
}


void MainWindow::on_btnResetAdmin_clicked()
{
    QStandardItemModel* model=static_cast<QStandardItemModel*>(ui->tvAdmin->model());
    model->removeRows(0,model->rowCount());//移除所有汽车数据行
    m_carMap.clear();

    //加载汽车数据
    QFile file(g_carFileName);
    if(file.exists()&&file.open(QIODevice::ReadOnly)){//打开汽车数据文件
        QTextStream stream(&file);//以文本流的方式读取文件
        stream.setCodec("UTF-8");//设置编码方式为u8
        for(;!stream.atEnd();){//循环读取文件行,直到读完文件内容
            QStringList datas=stream.readLine().split('\t',Qt::SkipEmptyParts);//将文本行内容分开
            if(datas.count()<4)continue;//如果缺少数据则跳过改行
            car c(datas[0],datas[1],datas[2],datas[3],&m_carMap);//实例化汽车对象
            m_carMap[datas[0]]=c;//将汽车加入管理图
        }
        file.close();//关闭文件
    }

    //添加汽车数据
    for(auto i=m_carMap.begin();i!=m_carMap.end();++i){
        model->insertRow(model->rowCount());//添加一行
        model->setData(model->index(model->rowCount()-1,0),i.value().getCarNum());//为模型赋值
        model->setData(model->index(model->rowCount()-1,1),i.value().getCarType());
        model->setData(model->index(model->rowCount()-1,2),i.value().getColor());
        model->setData(model->index(model->rowCount()-1,3),i.value().getAllTime().toString("yyyy-MM-dd-hh:mm:ss"));
        long long t=i.value().getAllTime().secsTo(QDateTime::currentDateTime());
        model->setData(model->index(model->rowCount()-1,4),QString("%1天%2时%3分%4秒").arg(t/24/60/60).arg((t%(24*60*60))/60/60).arg(t%(60*60)/60).arg(t%60));
        model->setData(model->index(model->rowCount()-1,5),((t%(24*60*60)/60/60)+(t%3600?1:0))*g_priceByHour);
    }

    QMessageBox::information(this,"提示","数据已重置.");
}


void MainWindow::on_btnSubmitAdmin_clicked()
{
    saveDate();//保存汽车数据信息
    QMessageBox::information(this,"提示","数据已提交.");
}


void MainWindow::on_actExitLogin_triggered()
{
    //更新汽车数据
    m_carMap.clear();
    QFile file(g_carFileName);
    if(file.exists()&&file.open(QIODevice::ReadOnly)){//打开汽车数据文件
        QTextStream stream(&file);//以文本流的方式读取文件
        stream.setCodec("UTF-8");//设置编码方式为u8
        for(;!stream.atEnd();){//循环读取文件行,直到读完文件内容
            QStringList datas=stream.readLine().split('\t',Qt::SkipEmptyParts);//将文本行内容分开
            if(datas.count()<4)continue;//如果缺少数据则跳过改行
            car c(datas[0],datas[1],datas[2],datas[3],&m_carMap);//实例化汽车对象
            m_carMap[datas[0]]=c;//将汽车加入管理图
        }
        file.close();//关闭文件
    }
    ui->editPswdLogin->clear();//清除密码输入栏
    ui->toolBar->hide();//隐藏工具栏
    ui->stackedWidget->setCurrentWidget(ui->pagLogin);//切换至登录界面
}

